package in.rob.client.page;
import in.lib.Constants;
import in.lib.event.DeletePostEvent;
import in.lib.event.NewPostEvent;
import in.lib.event.ProfileUpdatedEvent;
import in.lib.handler.streams.MissingPostsResponseHandler;
import in.lib.handler.streams.TimelineResponseHandler;
import in.lib.helper.ResponseHelper;
import in.lib.manager.APIManager;
import in.lib.manager.CacheManager;
import in.lib.manager.SettingsManager;
import in.lib.manager.UserManager;
import in.model.Stream;
import in.model.base.NetObject;
import in.obj.StreamMarker;
import in.rob.client.R;
import in.rob.client.page.base.PostStreamFragment;
import in.rob.client.widget.ScrollWidgetProvider;
import java.util.Date;
import net.callumtaylor.asynchttp.response.JsonResponseHandler;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import com.google.gson.JsonElement;
import com.squareup.otto.Subscribe;
/**
* Fragment used for displaying posts in a fragment list
* @author callumtaylor
*/
public class TimelinePage extends PostStreamFragment
{
// aux variables
private String mCoverUrl = "";
private long mLastRefreshed = 0;
private final int forceRefreshCount = 0;
// views
private TextView mLastRefreshedTv;
@Override public void onDataReady()
{
SharedPreferences prefs = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE);
int topPos = prefs.getInt(String.format(Constants.PREFS_TIMELINE_TOP_POSITION, UserManager.getUserId()), 0);
int topPosY = prefs.getInt(String.format(Constants.PREFS_TIMELINE_TOP_POSITION_Y, UserManager.getUserId()), 0);
getListView().setSelectionFromTop(topPos, topPosY);
}
@Override public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
if (SettingsManager.getShowTimelineCover())
{
//if (getAdapter() == null)
{
getHeadedListView().setHeaderView(R.layout.timeline_header_view);
mLastRefreshedTv = (TextView)getHeadedListView().findViewById(R.id.last_refreshed);
mLastRefreshed = getCacheManager().fileModifiedDate(getCacheFileName());
if (mLastRefreshed > 0)
{
setLastRefreshed();
}
if (UserManager.getUser() != null)
{
mCoverUrl = UserManager.getUser().getCoverUrl();
if (!UserManager.getUser().isCoverDefault())
{
setHeaderUrl(mCoverUrl);
}
}
}
}
}
@Override public void onResume()
{
super.onResume();
if (!isLoading()
&& SettingsManager.getCacheTimeout() > 0
&& getCacheManager().fileOlderThan(getCacheFileName(), System.currentTimeMillis() - SettingsManager.getCacheTimeout())
&& getAdapter().getBreakPosition() < 0)
{
loadFromApi();
}
}
@Override public void onForceRefresh()
{
if (getListView().getLastVisiblePosition() > SettingsManager.getPageSize()) return;
super.onForceRefresh();
}
/**
* Replacement for beginLoadFromApi() to allow us to call it
* from onResume(). Removes any chance of load duplication
*/
public void loadFromApi()
{
onForceRefresh();
}
@Override public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (requestCode == Constants.REQUEST_SETTINGS)
{
if (resultCode == Constants.RESULT_REFRESH)
{
if (data.getExtras().containsKey(Constants.EXTRA_REFRESH_TIMELINE))
{
onForceRefresh();
return;
}
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override public void loadMissingItems(final NetObject o)
{
showProgressLoader();
MissingPostsResponseHandler handler = new MissingPostsResponseHandler(getApplicationContext(), o);
ResponseHelper.getInstance().addResponse(getResponseKeys()[1], handler, this);
if (SettingsManager.isUsingUnified())
{
APIManager.getInstance().getMissingUnifiedTimeLine(o.getId(), -30, handler);
}
else
{
APIManager.getInstance().getMissingTimeLine(o.getId(), -30, handler);
}
}
@Override public void fetchStream(String lastId, boolean append)
{
showProgressLoader();
TimelineResponseHandler handler = new TimelineResponseHandler(getApplicationContext(), append, forceRefreshCount);
ResponseHelper.getInstance().addResponse(getResponseKeys()[0], handler, this);
if (SettingsManager.isUsingUnified())
{
APIManager.getInstance().getUnifiedTimeLine(lastId, handler);
}
else
{
APIManager.getInstance().getTimeLine(lastId, handler);
}
}
/**
* Sets the last refreshed time in the cover header
*/
public void setLastRefreshed(long time)
{
mLastRefreshed = time;
setLastRefreshed();
}
/**
* Sets the last refreshed time in the cover header
*/
public void setLastRefreshed()
{
String date = SettingsManager.getDateFormat().format(new Date(mLastRefreshed));
String time = SettingsManager.getTimeFormat().format(new Date(mLastRefreshed));
if (mLastRefreshedTv != null)
{
mLastRefreshedTv.setText(String.format(getString(R.string.last_refreshed), date, time));
}
}
@Override public void onStop()
{
if (SettingsManager.isStreamMarkerEnabled())
{
int pos = Math.max(0, getListView().getFirstVisiblePosition() - getListView().getHeaderViewsCount());
NetObject item = getAdapter().getItem(pos);
if (item != null && getAdapter() != null && getAdapter().getStreamMarker() != null)
{
String markerName = getAdapter().getStreamMarker().getName();
if (TextUtils.isEmpty(markerName))
{
markerName = "my_stream";
}
String id = item.getId();
boolean syncMarker = true;
if (!SettingsManager.isStreamMarkerPastEnabled())
{
try
{
long markerId = Long.parseLong(getAdapter().getStreamMarker().getId());
long postId = Long.parseLong(id);
if (postId < markerId)
{
syncMarker = false;
}
}
catch (Exception e){}
}
if (syncMarker)
{
APIManager.getInstance().updateMarker(id, markerName, new JsonResponseHandler()
{
@Override public void onSuccess()
{
JsonElement resp = getContent();
if (resp != null)
{
resp.getAsJsonObject().add("marker", resp.getAsJsonObject().get("data"));
StreamMarker marker = StreamMarker.fromObject(resp.getAsJsonObject());
Stream stream = CacheManager.getInstance().readFileAsObject(getCacheFileName(), Stream.class);
if (stream != null)
{
stream.setMarker(marker);
CacheManager.getInstance().writeFile(getCacheFileName(), stream);
}
}
}
});
}
}
}
super.onStop();
}
@Override public void onDestroyView()
{
int[] pos = getLastViewPosition(null);
SharedPreferences prefs = getContext().getSharedPreferences(getContext().getPackageName(), Context.MODE_PRIVATE);
prefs
.edit()
.putInt(String.format(Constants.PREFS_TIMELINE_TOP_POSITION, UserManager.getUserId()), pos[0])
.putInt(String.format(Constants.PREFS_TIMELINE_TOP_POSITION_Y, UserManager.getUserId()), pos[1])
.apply();
super.onDestroyView();
}
@Override public void onFinishedWriting()
{
if (android.os.Build.VERSION.SDK_INT >= 11)
{
Context context = getApplicationContext();
ComponentName name = new ComponentName(context, ScrollWidgetProvider.class);
int[] ids = AppWidgetManager.getInstance(context).getAppWidgetIds(name);
for (int index = 0; index < ids.length; index++)
{
Intent refresh = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
refresh.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, ids[index]);
getContext().sendBroadcast(refresh);
}
}
}
@Override public String getCacheFileName()
{
return String.format(Constants.CACHE_TIMELINE_LIST_NAME, UserManager.getUserId());
}
@Override public String[] getResponseKeys()
{
return new String[]
{
String.format(Constants.RESPONSE_TIMELINE, UserManager.getUserId()),
String.format(Constants.RESPONSE_TIMELINE_MISSING_POSTS, UserManager.getUserId())
};
}
@Subscribe public void onProfileUpdated(ProfileUpdatedEvent event)
{
setHeaderUrl(event.getUser().getCoverUrl());
}
@Subscribe @Override public void onPostRecieved(NewPostEvent event)
{
super.onPostRecieved(event);
writeToCache(getAdapter().getStream());
}
@Subscribe @Override public void onPostDeleted(DeletePostEvent event)
{
super.onPostDeleted(event);
}
@Override public void beginLoadFromApi(){}
}